#pragma once
#include <iostream>
using namespace std;

class ABC
{
public:
	virtual void View() { cout << "This is ABC!" << endl; }
	virtual ~ABC(){};
};


class baseDMA:public ABC
{
public:
	baseDMA(const char* l = "null", int r = 0);
	baseDMA(const baseDMA& rs);
	virtual ~baseDMA();
	baseDMA& operator=(const baseDMA& rs);
	virtual void View() { cout << "This is baseDMA!" << endl; cout << *this << endl; }
	friend ostream& operator<<(ostream& os, const baseDMA& rs);
private:
	char* label;
	int rating;
};

class lacksDMA :public baseDMA
{
public:
	lacksDMA(const char* c = "blank", const char* l = "null", int r=0);
	lacksDMA(const char* c, const baseDMA& rs);
	virtual void View() { cout << "This is lacksDMA!" << endl; cout << *this << endl; }

	friend ostream& operator<<(ostream& os, const lacksDMA& rs);
private:
	enum{COL_LEN=40};
	char color[COL_LEN];
};

class hasDMA :public baseDMA
{
public:
	hasDMA(const char* s = "none", const char* l = "null", int r = 0);
	hasDMA(const char* s, const baseDMA& rs);
	hasDMA(const hasDMA& hs);
	~hasDMA();
	hasDMA& operator=(const hasDMA& rs);
	virtual void View() { cout << "This is hasDMA!" << endl; cout << *this << endl; }

	friend ostream& operator<<(ostream& os, const hasDMA& rs);

private:
	char* style;
};
